import Decimal from 'decimal.js';
type numType = number | string;
/**
 * 如果传入的数，有非数字的情况 那么忽略这个数
 * 非数字的情况包括 null undefined
 * 因为null转数字的结果是 0  可能会影响计算结果。
 * 而这个可能不符合预期
 */
function initNum(num1: any, num2: any) {
  // 如果两个数都是非数字 那么直接返回0
  if (isNaN(num1) && isNaN(num2)) {
    return 0;
  }
  if (isNaN(num1)) {
    return num2;
  }
  if (isNaN(num2)) {
    return num1;
  }
}

/**
 * 加法
 */
export function plus(num1: numType, num2: numType) {
  try {
    const _num1 = num1 == null ? NaN : Number(num1);
    const _num2 = num2 == null ? NaN : Number(num2);
    // 如果两个数都是非数字 那么直接返回0
    const result = initNum(_num1, _num2);
    if (typeof result === 'number') {
      return result;
    }
    return new Decimal(_num1).add(_num2).toNumber();
    // return (isNaN(_num1) ? 0 : _num1) + (isNaN(_num2) ? 0 : _num2);
  } catch (err) {
    console.error('计算加法出错', err);
    return 0;
  }
}

/**
 * 减法
 */
export function minus(num1: numType, num2: numType) {
  try {
    const _num1 = num1 == null ? NaN : Number(num1);
    const _num2 = num2 == null ? NaN : Number(num2);
    // 如果两个数都是非数字 那么直接返回0
    const result = initNum(_num1, _num2);
    if (typeof result === 'number') {
      return result;
    }
    Decimal.set({ precision: 40 });
    return new Decimal(_num1).sub(_num2).toNumber();
    // return (isNaN(_num1) ? 0 : _num1) - (isNaN(_num2) ? 0 : _num2);
  } catch (err) {
    console.error('计算减法出错', err);
    return 0;
  }
}

/**
 * 乘法
 */
export function times(num1: numType, num2: numType) {
  try {
    const _num1 = num1 == null ? NaN : Number(num1);
    const _num2 = num2 == null ? NaN : Number(num2);
    // 如果两个数都是非数字 那么直接返回0
    const result = initNum(_num1, _num2);
    if (typeof result === 'number') {
      return result;
    }
    Decimal.set({ precision: 40 });
    return new Decimal(_num1).mul(_num2).toNumber();
    // return (isNaN(_num1) ? 0 : _num1) * (isNaN(_num2) ? 0 : _num2);
  } catch (err) {
    console.error('计算乘法出错', err);
    return 0;
  }
}

/**
 * 除法
 */
export function divide(num1: numType, num2: numType) {
  try {
    const _num1 = num1 == null ? NaN : Number(num1);
    const _num2 = num2 == null ? NaN : Number(num2);
    // 如果两个数都是非数字 那么直接返回0
    const result = initNum(_num1, _num2);
    if (typeof result === 'number') {
      return result;
    }
    Decimal.set({ precision: 40 });
    return new Decimal(_num1).div(_num2).toNumber();
    // return (isNaN(_num1) ? 0 : _num1) / (isNaN(_num2) ? 0 : _num2);
  } catch (err) {
    console.error('计算除法出错', err);
    return 0;
  }
}

/**
 * 四舍五入保留小数
 */
export function exactRound(num: numType, ratio: number) {
  try {
    const _num1 = num == null ? NaN : Number(num);
    if (isNaN(_num1)) {
      return 0;
      // return (0).toFixed(ratio);
    }
    Decimal.set({ precision: 40 });
    return new Decimal(num).toFixed(ratio);
    // return Number(num).toFixed(ratio);
  } catch (err) {
    return num;
  }
}

/**
 * 将字节数加上合适的单位
 * @param numBytes 字节数
 * @returns
 */
export function formatUnit(numBytes: number) {
  let _numBytes = Number(numBytes);

  if (isNaN(_numBytes)) {
    return numBytes;
  }

  const units = ['B', 'KB', 'MB', 'GB', 'TB'];
  let unitIndex = 0;

  while (_numBytes >= 1024 && unitIndex < units.length - 1) {
    _numBytes /= 1024;
    unitIndex++;
  }

  return _numBytes.toFixed(2) + units[unitIndex];
}
